package com.cskaoyan.javase.thread._4synchronized._1impl.exception;

/**
 * 结论:
 *      1.多线程环境下,多个线程的执行相对独立,某个线程产生异常终止,不会导致其它跟着结束,而是继续执行.
 *      2.当存在锁对象时,拿到锁对象的线程抛出异常终止,会同时释放这个锁
 *
 * StringBuffer VS StringBuilder
 * StringBuffer下的所有对外提供操作的成员方法都是synchronize关键字修饰的同步方法
 * 这样就导致在执行这些方法时,会进行线程同步,保证了数据安全,但效率也偏低
 * 所以StringBuffer是线程安全的,效率偏低的可变字符串
 *
 * StringBuilder下的所有对外提供操作的成员方法都是普通方法
 * 所以StringBuilder线程不安全,但是效率更高
 *
 * 结论:
 *      1.单线程环境下用StringBuilder,效率更高
 *      2.多线程环境下优先保证数据安全,使用StringBuffer
 *
 * @since 16:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    private static final Object LOCK = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (LOCK) {
                System.out.println("A线程拿到了锁对象!");
                while (true) {
                    try {
                        throw new RuntimeException("A线程抛出了一个运行时异常!");
                    } catch (RuntimeException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, "A").start();
        try {
            // 主线程休眠1秒钟,使得A线程大概率先执行
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() -> {
            synchronized (LOCK) {
                System.out.println("B线程拿到了锁对象!");
            }
        }, "B").start();
    }
}
